package com.gem.day09;

/**
 * 本类用来演示java.lang.Object类中的clone()方法
 * 该方法的作用是用来克隆对象的,克隆对象步骤:
 * 1.重写clone()方法,Object中的clone()方法修饰符是protected,修改为public
 * 2.调用对象的clone()方法进行克隆,clone()方法返回Object类型,所以需要进行类型转换
 * 3.要克隆对象,必须让对象类实现标记接口java.lang.Cloneable
 * 
 * @author easonsy
 * 2020年7月28日 上午10:44:14
 */
public class CloneDemo {
	public static void main(String[] args) {
		User user = new User("ann", 21,
				new Address[] { new Address("江苏", "苏州", "工业园区"), new Address("黑龙江", "大庆", "高新区") });
		User newUser = null;
		try {
			newUser = (User) user.clone();
			System.out.println(newUser);
		} catch (CloneNotSupportedException e) {
			//e.printStackTrace();
			System.err.println("User对象不支持克隆...");
		}

		System.out.println("-------------------------------------");

		/*
		 * 原对象和克隆对象的对比
		 * 1.基本类型 + 常用类型(日期,字符串),拷贝一份,所以修改A,不影响B
		 * 2.对象类型,拷贝的引用(地址),它是两个对象所公用的,所以修改A影响B
		 * 
		 * 结论:
		 * Object中的clone()方法默认情况下是浅拷贝[浅层复制][基本类型拷贝一份,对象类型共享];
		 * 可以通过重写clone()方法实现深层复制[基本类型和对象类型都拷贝一份]
		 */
		user.setName("ben");
		System.out.println(newUser.getName());

		user.getAddresses()[0].setArea("姑苏区");
		System.out.println(newUser.getAddresses()[0].getArea());

		System.out.println(user == newUser);
		System.out.println(user.equals(newUser));
	}
}
